package fumeurImpolie;

public class Fumeur implements Runnable{
	boolean ressourceDepart[] = new boolean[3];
	boolean ressourceAcquise[] = new boolean[3];
	String name;
	
	Fumeur(boolean DebutAvecTabac, boolean DebutAvecPapier, boolean DebutAvecAllumette, String name){
		System.out.println("Initialisation du fumeur " + name);
		ressourceDepart[0] = DebutAvecTabac;
		ressourceDepart[1] = DebutAvecPapier;
		ressourceDepart[2] = DebutAvecAllumette;
		
		for(int i = 0 ; i < ressourceAcquise.length ; ++i){
			ressourceAcquise[i] = false;
		}
		this.name = name;
	}

	@Override
	public void run() {
		System.out.println("Entrer du fumeur " + name + " dans le problème.");
		try {
			while(true){
				
				if(TableSingleton.GetInstance().VerifierIngredientDisponible(ressourceDepart, ressourceAcquise)){
					System.out.print("Le fumeur " + name + " prend ");
					ressourceAcquise[TableSingleton.GetInstance().prendreIngredient(ressourceDepart, ressourceAcquise)] = true;
					if(possedeToutesLesRessources()){
						for(int i = 0 ; i < ressourceAcquise.length ; ++i){
							ressourceAcquise[i] = false;
						}
						System.out.println("Le fumeur " + name + " fume pour deux secondes");
						Thread.sleep(2000);
					}
					Thread.yield(); // Pour s'assurer qu'un autre thread puisse continuer (eviter du monothreading a cause d'un monocore)
				}
				
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}
	
	public boolean possedeToutesLesRessources(){
		return ( (ressourceDepart[0] || ressourceAcquise[0] ) && (ressourceDepart[1] || ressourceAcquise[1] ) && (ressourceDepart[2] || ressourceAcquise[2] ) );
	}

	public boolean besoinDeRessource(int indexRessource) {
		return !(ressourceDepart[indexRessource] || ressourceAcquise[indexRessource] );
	}
}
